昨天晚上 今天凌晨在寫動態規劃的練習題
從兩點折騰到四點一連折騰了兩個小時有看了一會參考書還是沒有搞明白。
整什麼無向圖啊路徑啊一點也不新手友好。
但後來慢慢的看了看題目和源代碼,今天下午突然反應過來:
這不就是數學歸納法麼
跟大家分享一下。
首先,我們來回顧一下數學歸納法:
數學歸納法分爲兩種
1. 這兩種的共同點都是已經知道了n=1的時候的情況
2.兩者都知道了中間的信息
只不過一種知道的只是k-1的信息
另一種知道的是1~k-1的所有信息
3.目的都是求n = k時候的函數值
而對應到動態規劃的遞歸寫法
- 上文中的1對應的正好是邊界條件
- 上文中的2這對應的正是我們假定已經知道的信息(都可以通過1中的邊界求出來)
- 上文中對應的三正是偶們要求的目標
那麼解決動態規劃這類的問題就變成了以下三步:
- 抓住邊界(作爲遞歸邊界,是數學歸納時候的初始狀態)
- 找到狀態轉移方程(也就是數學歸納法中第k項和第k-1項或者前k-1項的關係)
- 之後進行根據上面兩點寫出遞歸函數,進行適當的優化。
廢話不多說,上例子
問題描述見我的上一篇博客:https://blog.csdn.net/weixin_42222917/article/details/83342269
這裏我們發現:
-
邊界條件是:
-
當一個括號裏只有一個元素的時候:也就是每一個元素都被單獨用括號括在一起了()這個時候返回0,作爲邊界條件
-
n = k 最終的結果(也就是第n項)在這裏的意義就是所有的括號都被打開之後
-
而n= k-1則是還差一個括號,所i有的括號都被打開
-
而n= k 和 n = k-1的關係則是
例子2:
最長公共子序列問題
參見
https://blog.csdn.net/weixin_42222917/article/details/83342710
在這裏,
邊界條件是:
當着兩個串中有一個的長度小於零的時候,返回0
n=k
代表着兩個最長字串的最長公共子序列
n = k-1 ~n=0
代表了這兩個串的子串的最長公共子序列
而他們之間的關係如下圖